/*
 * This file is part of the eccOS Library.
 * Copyright (C) 2007.
 *
 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
 *
 * The contents of this file are subject to the Mozilla Public License Version
 * 1.1 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * Alternatively, the contents of this file may be used under the terms of
 * either the GNU General Public License Version 2 or later (the "GPL"), or
 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 * in which case the provisions of the GPL or the LGPL are applicable instead
 * of those above. If you wish to allow use of your version of this file only
 * under the terms of either the GPL or the LGPL, and not to allow others to
 * use your version of this file under the terms of the MPL, indicate your
 * decision by deleting the provisions above and replace them with the notice
 * and other provisions required by the GPL or the LGPL. If you do not delete
 * the provisions above, a recipient may use your version of this file under
 * the terms of any one of the MPL, the GPL or the LGPL.
 */
package org.openeccos.table.renderer;

import org.openeccos.table.BaseTableModel;

import nextapp.echo2.app.CheckBox;
import nextapp.echo2.app.Component;
import nextapp.echo2.app.Table;
import nextapp.echo2.app.event.ActionEvent;
import nextapp.echo2.app.event.ActionListener;
import nextapp.echo2.app.table.TableCellRenderer;

/**
 * @author Alejandro Salas
 * Created on Jul 5, 2007
 */
public class BooleanRenderer implements TableCellRenderer {

	public boolean editable;
	private boolean isHeader;

	public BooleanRenderer(boolean editable) {
		this.editable = editable;
	}

	public BooleanRenderer(boolean editable, boolean isHeader) {
		this.editable = editable;
		this.isHeader = isHeader;
	}

	public Component getTableCellRendererComponent(final Table table, Object value, final int col, final int row) {
		final BaseTableModel model = (BaseTableModel) table.getModel();

		final CheckBox checkBox = new CheckBox();
		final boolean bVal = (Boolean) value;

		checkBox.setVisible(isEnable(row));

		checkBox.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				setSelected(table, model, checkBox.isSelected(), col, row);
			}
		});
		checkBox.setSelected(bVal);

		return checkBox;
	}

	// Override in children to have custom behaving
	protected boolean isEnable(int value) {
		return true;
	}

	protected void setSelected(Table table, BaseTableModel model, boolean selected, int col, int row) {
		if (isHeader) {
			table.getColumnModel().getColumn(col).setHeaderValue(selected);

			for (int i = 0; i < model.getRowCount(); i++) {
				model.setValueAt(selected, col, i);
			}
			model.fireTableDataChanged();
		} else {
			model.setValueAt(selected, col, row);
		}
	}
}